﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using Prueba.Model;
using System.ComponentModel;
using DAL.EstRec;
using System.Data.SqlClient;
using System.Data;

namespace DataMapper
{
    public class FdvDataMapper
    {
        public ObservableCollection<RowFdv> GetPivotFdv()
        {
            ObservableCollection<RowFdv> rows = new ObservableCollection<RowFdv>();

            Recurso rec1=new Recurso(){ RecursoId="Rec1",RecursoName="Recurso Uno",TiempoImplementacion=2,VisitasSugeridas=1};
            Recurso rec2 = new Recurso() { RecursoId = "Rec2", RecursoName = "Recurso Dos", TiempoImplementacion = 1, VisitasSugeridas = 2 };
            Recurso rec3 = new Recurso() { RecursoId = "Rec3", RecursoName = "Recurso Tres", TiempoImplementacion = 4, VisitasSugeridas = 3 };

            Pos pos = new Pos() { PosId = "Pos1", PosName = "PosUno" };
            Pos pos2 = new Pos() { PosId = "Pos2", PosName = "PosDos" };

            ColFdvIndexer Col = new ColFdvIndexer();
            Col["Rec1"] = new ColFdv(pos, rec1, 10,Col);
            Col["Rec2"] = new ColFdv(pos, rec2, 20,Col);
            Col["Rec3"] = new ColFdv(pos, rec3, 50, Col);

            ColFdvIndexer Col2 = new ColFdvIndexer();
            Col2["Rec1"] = new ColFdv(pos2, rec1, 1,Col2);
            Col2["Rec2"] = new ColFdv(pos2, rec2, 5, Col2);
            Col2["Rec3"] = new ColFdv(pos2, rec3, 7, Col2);

            rows.Add(new RowFdv()
                {
                    Pos = pos,
                    Cols = Col
                }
            );
            rows.Add(new RowFdv()
            {
                Pos = pos2,
                Cols = Col2
            }
            );



            return rows;
        }

        public void GetPivotFdv(ref FdvVersion unidVersion,ref ObservableCollection<Recurso> recursos, ref ObservableCollection<RowFdv> rows, ref ObservableCollection<RowTotalRecurso> totales, ref PropertyChangedEventHandler calcularTotalRecursoDelegate,string territorio)
        {
            //Ejecutar el stored
            SqlCommand cmd = new SqlCommand("SP_GET_PANELACTIVIDADES_DATA");
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@unidVersion", unidVersion.Unid));
            cmd.Parameters.Add(new SqlParameter("@territorio",territorio ));

            try
            {
                //Debe respondar 2 dataTables
                DataSet response=SrvDB.ExecuteCommand(cmd);

                try
                {
                    //Primer data table debe traer información de recurso ordenada por ids iniciativa y recurso
                    #region Recursos
                    recursos = new ObservableCollection<Recurso>();
                    foreach (DataRow dr in response.Tables[0].Rows)
                    {
                        recursos.Add(new Recurso()
                                {
                                    Iniciativa = new Iniciativa()
                                    {
                                        IniciativaId = dr.IsNull("ID_INICIATIVA") ? "" : dr["ID_INICIATIVA"].ToString(),
                                        IniciativaName = dr.IsNull("INICIATIVA") ? "" : dr["INICIATIVA"].ToString(),
                                    },
                                    RecursoId = dr.IsNull("ID_RECURSO") ? "" : dr["ID_RECURSO"].ToString(),
                                    RecursoName = dr.IsNull("RECURSO") ? "" : dr["RECURSO"].ToString(),
                                    TiempoImplementacion = dr.IsNull("TIEMPO_IMPLEMENTACION") ? 0 : (int)dr["TIEMPO_IMPLEMENTACION"],
                                    VisitasSugeridas = dr.IsNull("VISITAS_SUGERIDAS") ? 0 : (int)dr["VISITAS_SUGERIDAS"],
                                    ExcluirReglaIniciativa = dr.IsNull("EXCLUIR_REGLA_INICIATIVA") ? false : (bool)dr["EXCLUIR_REGLA_INICIATIVA"],
                                    ExcluirReglaRecurso = dr.IsNull("EXCLUIR_REGLA_MAX_RECURSOS") ? false : (bool)dr["EXCLUIR_REGLA_MAX_RECURSOS"],
                                    MaxIniciativas=2,
                                    MaxRecursos=3,
                                    MaxAsignado = dr.IsNull("MAX_CANTIDAD") ? 0 : (int)dr["MAX_CANTIDAD"]
                                }
                            );
                    }
                    #endregion

                    //Datos de totales
                    #region Datos Totales
                    totales = new ObservableCollection<RowTotalRecurso>();
                    RecursoIndexer riTiempoImp = new RecursoIndexer();
                    RecursoIndexer riVisitasSug = new RecursoIndexer();
                    RecursoIndexer riRecursos = new RecursoIndexer();
                    RecursoIndexer riDisponible = new RecursoIndexer();

                    foreach (Recurso r in recursos)
                    {
                        riTiempoImp[r.RecursoId] = new RecursoTotal("Tiempo Implementacion", r);
                        riVisitasSug[r.RecursoId] = new RecursoTotal("Visitas Sugeridas", r);
                        riRecursos[r.RecursoId] = new RecursoTotal("Recursos", r);
                        riDisponible[r.RecursoId] = new RecursoTotal("Disponible", r);
                    }
                    totales.Add(new RowTotalRecurso() { IndicadorName = "Tiempo Implementacion", Recursos = riTiempoImp });
                    totales.Add(new RowTotalRecurso() { IndicadorName = "Visitas Sugeridas", Recursos = riVisitasSug });
                    totales.Add(new RowTotalRecurso() { IndicadorName = "Recursos", Recursos = riRecursos });
                    totales.Add(new RowTotalRecurso() { IndicadorName = "Disponible", Recursos = riDisponible });
                    #endregion

                    //Segundo data table contiene los datos de la tabla pivote
                    #region Datos TablaPivote
                    rows = new ObservableCollection<RowFdv>();
                    foreach (DataRow dr in response.Tables[1].Rows)
                    {
                        //Crear objeto Pos
                        Pos p = new Pos()
                        {
                            PosId = dr.IsNull("ID_POS") ? "" : dr["ID_POS"].ToString(),
                            PosName = dr.IsNull("POS") ? "" : dr["POS"].ToString(),
                            RazonSocial = dr.IsNull("RAZON_SOCIAL") ? "" : dr["RAZON_SOCIAL"].ToString(),
                            Canal = dr.IsNull("CANAL") ? "" : dr["CANAL"].ToString(),
                            SubCanal = dr.IsNull("SUB_CANAL") ? "" : dr["SUB_CANAL"].ToString(),
                            Potencial = dr.IsNull("POTENCIAL") ? "" : dr["POTENCIAL"].ToString(),
                            Estado = dr.IsNull("ESTADO") ? "" : dr["ESTADO"].ToString(),
                            Municipio = dr.IsNull("MUNICIPIO") ? "" : dr["MUNICIPIO"].ToString(),
                            Localidad = dr.IsNull("LOCALIDAD") ? "" : dr["LOCALIDAD"].ToString(),
                            Colonia = dr.IsNull("COLONIA") ? "" : dr["COLONIA"].ToString(),
                            CodigoPostal = dr.IsNull("CODIGO_POSTAL") ? "" : dr["CODIGO_POSTAL"].ToString(),
                            VisitasSugeridas = dr.IsNull("VISITAS_SUGERIDAS") ? 0 : (int)dr["VISITAS_SUGERIDAS"],
                            TiempoImplementacion = dr.IsNull("TIEMPO_IMPLEMENTACION") ? 0 : (int)dr["TIEMPO_IMPLEMENTACION"],
                            Iniciativas = dr.IsNull("NUM_INICIATIVA") ? 0 : (int)dr["NUM_INICIATIVA"],
                            Recursos = dr.IsNull("NUM_RECURSO") ? 0 : (int)dr["NUM_RECURSO"]
                            //PosColVisibility=posColVisibility
                        };
                        //p.PropertyChanged += calcularTotalRecursoDelegate;

                        //Crear objeto indexer
                        ColFdvIndexer cfi = new ColFdvIndexer();

                        rows.Add(new RowFdv()
                        {
                            Pos = p,
                            Cols = cfi
                        });

                        foreach (Recurso r in recursos)
                        {
                            if (response.Tables[1].Columns.Contains(r.RecursoId))
                            {
                                ColFdv cell=new ColFdv(p, r, 0, cfi);
                                cfi[r.RecursoId] = cell;
                                cell.PropertyChanged+=calcularTotalRecursoDelegate;
                                cell.Cantidad = (dr.IsNull(r.RecursoId) ? 0 : (int)dr[r.RecursoId]);
                                cell.IsDataModified = false;
                            }
                        }
                    }

                    //Tercer datatable debe traer un single row para asignar la bandera si está publicado o no
                    unidVersion.IsPublished = (bool)response.Tables[2].Rows[0]["IS_PUBLISHED"];
                    unidVersion.IsClosed = (bool)response.Tables[2].Rows[0]["IS_CLOSED"];
                    #endregion

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            //Excepcion de Ejecución de dataset
            catch (Exception ex) 
            {
                Console.WriteLine(ex.Message);
            }

            /*
            //Inicializar variables
            recursos = new ObservableCollection<Recurso>();
            rows = new ObservableCollection<RowFdv>();
            totales = new ObservableCollection<RowTotalRecurso>();

            //Obtener datos
            ObservableCollection<RowFdv> _rows = new ObservableCollection<RowFdv>();

            Recurso rec1 = new Recurso()
            {
                RecursoId = "Rec1",
                RecursoName = "Recurso Uno",
                TiempoImplementacion = 2,
                VisitasSugeridas = 1,
                Iniciativa = new Iniciativa() { IniciativaId = "Inc1", IniciativaName = "Iniciativa1" }
            };
            Recurso rec2 = new Recurso() 
            { 
                RecursoId = "Rec2", RecursoName = "Recurso Dos", TiempoImplementacion = 1, VisitasSugeridas = 2 ,
                Iniciativa = new Iniciativa() { IniciativaId = "Inc1", IniciativaName = "Iniciativa1" }
            };
            Recurso rec3 = new Recurso() 
            { 
                RecursoId = "Rec3", RecursoName = "Recurso Tres", TiempoImplementacion = 4, VisitasSugeridas = 3 ,
                Iniciativa = new Iniciativa() { IniciativaId = "Inc2", IniciativaName = "Iniciativa2" }
            };

            Pos pos = new Pos() { PosId = "Pos1", PosName = "PosUno" };
            Pos pos2 = new Pos() { PosId = "Pos2", PosName = "PosDos" };

            ColFdvIndexer Col = new ColFdvIndexer();
            ColFdv cf = new ColFdv(pos, rec1, 10, Col);
            cf.PropertyChanged += calcularTotalRecursoDelegate;
            Col["Rec1"] = cf;

            cf = new ColFdv(pos, rec2, 10, Col);
            cf.PropertyChanged += calcularTotalRecursoDelegate;
            Col["Rec2"] = cf;

            cf = new ColFdv(pos, rec3, 10, Col);
            cf.PropertyChanged += calcularTotalRecursoDelegate;
            Col["Rec3"] = cf;

            ColFdvIndexer Col2 = new ColFdvIndexer();
            cf = new ColFdv(pos2, rec1, 10, Col2);
            cf.PropertyChanged += calcularTotalRecursoDelegate;
            Col2["Rec1"] = cf;

            cf = new ColFdv(pos2, rec2, 10, Col2);
            cf.PropertyChanged += calcularTotalRecursoDelegate;
            Col2["Rec2"] = cf;

            cf = new ColFdv(pos2, rec3, 10, Col2);
            cf.PropertyChanged += calcularTotalRecursoDelegate;
            Col2["Rec3"] = cf;

            _rows.Add(new RowFdv()
            {
                Pos = pos,
                Cols = Col
            }
            );
            _rows.Add(new RowFdv()
            {
                Pos = pos2,
                Cols = Col2
            }
            );

            //Asignar datos
            recursos.Add(rec1);
            recursos.Add(rec2);
            recursos.Add(rec3);

            rows = _rows;

            RecursoIndexer ri = new RecursoIndexer();
            ri[rec1.RecursoId] = new RecursoTotal("Tiempo Implementacion",rec1);
            ri[rec2.RecursoId] = new RecursoTotal("Tiempo Implementacion", rec2);
            ri[rec3.RecursoId] = new RecursoTotal("Tiempo Implementacion", rec3);
            totales.Add(new RowTotalRecurso() { IndicadorName = "Tiempo Implementacion", Recursos = ri });

            ri = new RecursoIndexer();
            ri[rec1.RecursoId] = new RecursoTotal("Visitas Sugeridas", rec1);
            ri[rec2.RecursoId] = new RecursoTotal("Visitas Sugeridas", rec2);
            ri[rec3.RecursoId] = new RecursoTotal("Visitas Sugeridas", rec3);
            totales.Add(new RowTotalRecurso() { IndicadorName = "Visitas Sugeridas", Recursos = ri });

            ri = new RecursoIndexer();
            ri[rec1.RecursoId] = new RecursoTotal("Recursos", rec1);
            ri[rec2.RecursoId] = new RecursoTotal("Recursos", rec2);
            ri[rec3.RecursoId] = new RecursoTotal("Recursos", rec3);
            totales.Add(new RowTotalRecurso() { IndicadorName = "Recursos", Recursos = ri });
             */
        }//endfunc

        public void SaveFdvData(ref ObservableCollection<RowFdv> rows,FdvVersion version)
        {
            int flushEvery = 5000;
            int count = 0;
            string baseSqlStmt = "exec SP_UPSERT_FDVBGT @unidVersion=" + version.Unid.ToString()
                        + ",@idPos='@@par2'"
                        + ",@idRecurso='@@par3'"
                        + ",@cantidad=@@par4;";
            string sqlStmt = "";

            foreach (RowFdv r in rows)
            {
                foreach (KeyValuePair<string, ColFdv> item in r.Cols._cols)
                {
                    if (item.Value.IsDataModified)
                    {
                        sqlStmt += baseSqlStmt.Replace(
                                    "@@par2", item.Value.Pos.PosId
                                ).Replace(
                                    "@@par3", item.Value.Recurso.RecursoId
                                ).Replace(
                                    "@@par4", item.Value.Cantidad.ToString()
                                );
                        sqlStmt += "; ";
                        item.Value.IsDataModified = false;

                        count++;
                    }
                }

                if (count >= flushEvery)
                {
                    try
                    {
                        SrvDB.ExecuteNonQuery(sqlStmt);
                        sqlStmt = "";
                        count = 0;
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }

                if (!String.IsNullOrEmpty(sqlStmt))
                {
                    try
                    {
                        SrvDB.ExecuteNonQuery(sqlStmt);
                        sqlStmt = "";
                        count = 0;
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
            }
        }
    }//endclass
}//endnamespace
